package cn.iocoder.yudao.module.jifenyuan.dal.mysql.roomuserbind;

import java.util.*;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.roomuserbind.RoomUserBindDO;
import cn.iocoder.yudao.module.jifenyuan.enums.JifenyuanRoomUserStatusEnum;
import cn.iocoder.yudao.module.jifenyuan.enums.JifenyuanRoomUserTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.jifenyuan.controller.app.roomuserbind.vo.*;
import org.apache.ibatis.annotations.Param;

/**
 * 记分员 房间与成员绑定 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface RoomUserBindMapper extends BaseMapperX<RoomUserBindDO> {

    default PageResult<RoomUserBindDO> selectPage(AppRoomUserBindPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<RoomUserBindDO>()
                .eqIfPresent(RoomUserBindDO::getRoomId, reqVO.getRoomId())
                .eqIfPresent(RoomUserBindDO::getUserId, reqVO.getUserId())
                .eqIfPresent(RoomUserBindDO::getStatus, reqVO.getStatus())
                .eqIfPresent(RoomUserBindDO::getScore, reqVO.getScore())
                .eqIfPresent(RoomUserBindDO::getType, reqVO.getType())
                .betweenIfPresent(RoomUserBindDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(RoomUserBindDO::getId));
    }

    default List<RoomUserBindDO> selectList(AppRoomUserBindExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<RoomUserBindDO>()
                .eqIfPresent(RoomUserBindDO::getRoomId, reqVO.getRoomId())
                .eqIfPresent(RoomUserBindDO::getUserId, reqVO.getUserId())
                .eqIfPresent(RoomUserBindDO::getStatus, reqVO.getStatus())
                .eqIfPresent(RoomUserBindDO::getScore, reqVO.getScore())
                .eqIfPresent(RoomUserBindDO::getType, reqVO.getType())
                .betweenIfPresent(RoomUserBindDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(RoomUserBindDO::getId));
    }


    default List<RoomUserBindDO> selectRoomJoinerByUserId(Long roomId,Long userId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getUserId,userId));
    }

    default List<RoomUserBindDO> selectRoomJoiner(Long roomId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId));
    }

    default List<RoomUserBindDO> selectRoomPartnerList(Long roomId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.PARTNER.getStatus())
                );
    }

    default List<RoomUserBindDO> selectRoomOnlinePartnerList(Long roomId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.PARTNER.getStatus())
        .eq(RoomUserBindDO::getStatus, JifenyuanRoomUserStatusEnum.ONLINE.getStatus()));
    }
    default Long selectRoomOnlinePartneCount(Long roomId){
        return selectCount(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.PARTNER.getStatus())
                .eq(RoomUserBindDO::getStatus, JifenyuanRoomUserStatusEnum.ONLINE.getStatus()));
    }
    default List<RoomUserBindDO> selectRoomOnlineObserverList(Long roomId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.OBSERVER.getStatus())
                .eq(RoomUserBindDO::getStatus, JifenyuanRoomUserStatusEnum.ONLINE.getStatus()));
    }
    default RoomUserBindDO selectRoomPartnerByUserId(Long roomId,Long userId){
        return selectOne(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.PARTNER.getStatus())
                .eq(RoomUserBindDO::getUserId, userId));
    }

    default int updateRoomPartnerHideByUserId(Long roomId,Long userId,boolean hide){
        RoomUserBindDO bindDO = new RoomUserBindDO();
        bindDO.setHide(hide);
        return update(bindDO,new LambdaUpdateWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.PARTNER.getStatus())
                .eq(RoomUserBindDO::getUserId, userId));
    }

    default List<RoomUserBindDO> selectRoomObserverByUserId(Long roomId,Long userId){
        return selectList(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.OBSERVER.getStatus())
                .eq(RoomUserBindDO::getUserId, userId));
    }
    default RoomUserBindDO selectRoomObserverByUserIdAndSource(Long roomId,Long userId,String source){
        return selectOne(new LambdaQueryWrapper<RoomUserBindDO>()
                .eq(RoomUserBindDO::getRoomId,roomId)
                .eq(RoomUserBindDO::getType, JifenyuanRoomUserTypeEnum.OBSERVER.getStatus())
                .eq(RoomUserBindDO::getObserverSource,source)
                .eq(RoomUserBindDO::getUserId, userId));
    }

    int addScore(@Param("roomId")Long roomId, @Param("userId")Long userId, @Param("score") Long score);

    int reduceScore(@Param("roomId")Long roomId, @Param("userId")Long userId, @Param("score") Long score);


}
